package com.cencat.order.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 配送跟踪视图对象
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@Accessors(chain = true)
public class DeliveryVO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 配送ID
     */
    private Long deliveryId;

    /**
     * 配送编号
     */
    private String deliveryCode;

    /**
     * 订单ID
     */
    private Long orderId;

    /**
     * 订单编号
     */
    private String orderCode;

    /**
     * 派单ID
     */
    private Long dispatchId;

    /**
     * 派单编号
     */
    private String dispatchCode;

    /**
     * 司机ID
     */
    private Long driverId;

    /**
     * 司机编号
     */
    private String driverCode;

    /**
     * 司机姓名
     */
    private String driverName;

    /**
     * 司机手机号
     */
    private String driverPhone;

    /**
     * 车辆ID
     */
    private Long vehicleId;

    /**
     * 车牌号
     */
    private String vehicleNumber;

    /**
     * 商家ID
     */
    private Long merchantId;

    /**
     * 商家名称
     */
    private String merchantName;

    /**
     * 配送状态(0-待取货 1-已取货 2-配送中 3-已送达 4-异常 5-已取消)
     */
    private Integer deliveryStatus;

    /**
     * 配送状态描述
     */
    private String deliveryStatusDesc;

    /**
     * 配送类型(1-标准配送 2-加急配送 3-预约配送)
     */
    private Integer deliveryType;

    /**
     * 配送类型描述
     */
    private String deliveryTypeDesc;

    /**
     * 优先级(1-低 2-中 3-高 4-紧急)
     */
    private Integer priority;

    /**
     * 优先级描述
     */
    private String priorityDesc;

    /**
     * 货物名称
     */
    private String goodsName;

    /**
     * 货物重量(kg)
     */
    private BigDecimal goodsWeight;

    /**
     * 货物体积(立方米)
     */
    private BigDecimal goodsVolume;

    /**
     * 货物数量
     */
    private Integer goodsQuantity;

    /**
     * 货物价值
     */
    private BigDecimal goodsValue;

    /**
     * 取货地址
     */
    private String pickupAddress;

    /**
     * 取货联系人
     */
    private String pickupContact;

    /**
     * 取货联系电话
     */
    private String pickupPhone;

    /**
     * 取货经度
     */
    private BigDecimal pickupLongitude;

    /**
     * 取货纬度
     */
    private BigDecimal pickupLatitude;

    /**
     * 配送地址
     */
    private String deliveryAddress;

    /**
     * 配送联系人
     */
    private String deliveryContact;

    /**
     * 配送联系电话
     */
    private String deliveryPhone;

    /**
     * 配送经度
     */
    private BigDecimal deliveryLongitude;

    /**
     * 配送纬度
     */
    private BigDecimal deliveryLatitude;

    /**
     * 当前位置经度
     */
    private BigDecimal currentLongitude;

    /**
     * 当前位置纬度
     */
    private BigDecimal currentLatitude;

    /**
     * 当前位置地址
     */
    private String currentAddress;

    /**
     * 位置更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime locationUpdateTime;

    /**
     * 预计距离(公里)
     */
    private BigDecimal estimatedDistance;

    /**
     * 预计时长(分钟)
     */
    private Integer estimatedDuration;

    /**
     * 实际距离(公里)
     */
    private BigDecimal actualDistance;

    /**
     * 实际时长(分钟)
     */
    private Integer actualDuration;

    /**
     * 配送费用
     */
    private BigDecimal deliveryFee;

    /**
     * 预计取货时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime estimatedPickupTime;

    /**
     * 实际取货时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime actualPickupTime;

    /**
     * 预计送达时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime estimatedDeliveryTime;

    /**
     * 实际送达时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime actualDeliveryTime;

    /**
     * 开始配送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startDeliveryTime;

    /**
     * 完成配送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime completeDeliveryTime;

    /**
     * 签收人
     */
    private String signedBy;

    /**
     * 签收时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime signedTime;

    /**
     * 签收照片
     */
    private String signedPhoto;

    /**
     * 异常类型(1-货物损坏 2-地址错误 3-联系不上 4-拒收 5-其他)
     */
    private Integer exceptionType;

    /**
     * 异常描述
     */
    private String exceptionDescription;

    /**
     * 异常处理状态(0-未处理 1-处理中 2-已处理)
     */
    private Integer exceptionHandleStatus;

    /**
     * 异常处理结果
     */
    private String exceptionHandleResult;

    /**
     * 异常处理时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime exceptionHandleTime;

    /**
     * 取消原因
     */
    private String cancelReason;

    /**
     * 取消时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime cancelTime;

    /**
     * 客户评价分数
     */
    private BigDecimal customerRating;

    /**
     * 客户评价内容
     */
    private String customerFeedback;

    /**
     * 评价时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime feedbackTime;

    /**
     * 配送路径轨迹
     */
    private List<DeliveryTrackVO> deliveryTracks;

    /**
     * 配送进度百分比
     */
    private BigDecimal progressPercentage;

    /**
     * 剩余距离(公里)
     */
    private BigDecimal remainingDistance;

    /**
     * 预计剩余时间(分钟)
     */
    private Integer estimatedRemainingTime;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 配送轨迹视图对象
     */
    @Data
    @Accessors(chain = true)
    public static class DeliveryTrackVO implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 轨迹ID
         */
        private Long trackId;

        /**
         * 经度
         */
        private BigDecimal longitude;

        /**
         * 纬度
         */
        private BigDecimal latitude;

        /**
         * 地址
         */
        private String address;

        /**
         * 速度(km/h)
         */
        private BigDecimal speed;

        /**
         * 方向角度
         */
        private BigDecimal direction;

        /**
         * 记录时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime recordTime;

        /**
         * 状态描述
         */
        private String statusDescription;
    }
}